package com.坦克大战.Tank_2;

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Vector;

/** KeyListener 监听器，监听键盘事件的发生 */
public class MyPanel extends JPanel implements KeyListener,Runnable {

    MyTank tank = null;  //我的坦克
    Vector<EnemyTanks> enemyTanks = new Vector<>();  //敌方坦克集合
    int enemyTanksNum = 3;  //敌方坦克数量
    public MyPanel() {
        tank = new MyTank(100,100,30);  //创建我方坦克，初始坐标和速度
        for (int i = 0; i < enemyTanksNum; i++) {    //创建敌方坦克放到集合当中，初始坐标和速度
            enemyTanks.add(new EnemyTanks(100 * (i + 1),0,10));
        }

    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.setColor(Color.darkGray);  //背景颜色
        g.fillRect(0,0,this.getWidth(),this.getHeight()); //铺满整个界面

        drawTank(g,tank.getX(),tank.getY(),0,tank.getDirection()); //画坦克的方法；（画笔，x，y，颜色，方向）
        for (EnemyTanks ETank : enemyTanks) {
            drawTank(g, ETank.getX(), ETank.getY(), 1, ETank.getDirection()); //画坦克的方法；（画笔，x，y，颜色，方向）
        }

        for (int i = 0; i < tank.TankBullets.size(); i++) {//循环重绘子弹
            if (tank.TankBullets.get(i) != null && tank.TankBullets.get(i).isLive) { //如果子弹存在
                drawShoot(g, tank.TankBullets.get(i).x, tank.TankBullets.get(i).y, 0, tank.TankBullets.get(i).direction);//画子弹的方法
            }
        }


    }


    /**
     *
     * @param g 画笔
     * @param x 横坐标
     * @param y 纵坐标
     * @param type 区分敌我的颜色数字
     * @param direction 区分方向 0向上，1向左 2向下 3向右
     */
    public void drawTank(Graphics g,int x,int y,int type , int direction) {

        choiceTankColor(g,type);  //选择坦克的颜色方法；
        choiceTankDirection(x,y,g,direction); //绘制坦克以及方向的方法
    }
    public void drawShoot(Graphics g,int x,int y,int type , int direction) {
        choiceTankColor(g,type);//用坦克的颜色代替子弹颜色；
        choiceShootDirection(x,y,g);
    }



    @Override  //键盘事件监听方法
    public void keyPressed(KeyEvent e) {  //改变坐标和方向
        //根据按下的按钮 进行判断;
        if (e.getKeyCode() == KeyEvent.VK_LEFT) {
            tank.moveLEFT();
        }
        else if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
            tank.moveRIGHT(this.getWidth());
        }
        else if (e.getKeyCode() == KeyEvent.VK_UP) {
            tank.moveUP();
        }
        else if (e.getKeyCode() == KeyEvent.VK_DOWN) {
            tank.moveDOWN(this.getHeight());
        }else if (e.getKeyCode() == KeyEvent.VK_J) {
            tank.shootEnemyTank();

        }


        this.repaint();//改变完方向和坐标后，主动设置重绘，会主动调用paint方法，用新的x和y来重新画；

    }


    //暂时没用的2个方法；
    @Override
    public void keyTyped(KeyEvent e) {}
    @Override
    public void keyReleased(KeyEvent e) {}

    //选择坦克的颜色；
    public void choiceTankColor(Graphics g ,int type) {
        switch (type){
            case 0:g.setColor(Color.CYAN); //自己的颜色
                break;
            case 1:g.setColor(Color.red);  //敌人的颜色
                break;
        }
    }

    //绘制坦克方法
    public void choiceTankDirection(int x,int y,Graphics g,int direction){
        //int width1 = 10,height1 = 60; //轮子尺寸
        //int width2 = 20,height2 = 40; //车舱尺寸
        //int r = 20; //盖子直径
        //x y 初始化为100
        switch (direction){ //选择方向
            case 0:
                g.fill3DRect(x,y,10,60,false);  //左轮子
                g.fill3DRect(x+10,y+10,20,40,false);    //中间坦克舱
                g.fill3DRect(x+10+20,y,10,60,false);    //右轮子
                g.drawLine(x+10+10,y+10+20,x+10+10,y);  //炮管线
                g.fillOval(x+10,(y+60/2)-10,20,20);  //盖子
                break;
            case 1:
                g.fill3DRect(x,y,60,10,false);  //左轮子
                g.fill3DRect(x+10,y+10,40,20,false);    //中间坦克舱
                g.fill3DRect(x,y+10+20,60,10,false);    //右轮子
                g.drawLine(x+10+10,y+10+10,x,y+20);  //炮管线
                g.fillOval(x+30-10,y+10,20,20);  //盖子
                break;
            case 2 :
                g.fill3DRect(x,y,10,60,false);  //左轮子
                g.fill3DRect(x+10,y+10,20,40,false);    //中间坦克舱
                g.fill3DRect(x+10+20,y,10,60,false);    //右轮子
                g.drawLine(x+10+10,y+10+20,x+10+10,y+60);  //炮管线
                g.fillOval(x+10,(y+60/2)-10,20,20);  //盖子
                break;
            case 3:
                g.fill3DRect(x,y,60,10,false);  //左轮子
                g.fill3DRect(x+10,y+10,40,20,false);    //中间坦克舱
                g.fill3DRect(x,y+10+20,60,10,false);    //右轮子
                g.drawLine(x+10+10,y+10+10,x+60,y+20);  //炮管线
                g.fillOval(x+30-10,y+10,20,20);  //盖子
                break;
        }
    }
    public void choiceShootDirection(int x,int y,Graphics g){
        g.fillOval(x,y,5,5);
    }

    @Override
    public void run() {
        while(true){
            try {
                Thread.sleep(1000/60);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            this.repaint();
        }
    }
}
